<?php
declare(strict_types=1);

namespace Newbie\Helper;

class NewbieZip {

    /**
     * @param string $folderPath
     * @param string $zipFileName
     */
    public function makeZip (string $folderPath, string $zipFileName): void {
        $zip = new \ZipArchive(); // 创建ZipArchive对象
        if (file_exists($zipFileName)) {
            // 存在时覆盖
            $zipr = $zip->open($zipFileName, \ZipArchive::OVERWRITE);
        } else {
            // 不存在时创建
            $zipr = $zip->open($zipFileName, \ZipArchive::CREATE);
        }
        if ($zipr) {
            //调用方法，对要打包的根目录进行操作，并将ZipArchive的对象传递给方法
            $this->addFileToZip($folderPath . '/', $zip);
            $zip->close(); //关闭处理的zip文件
        }

    }

    /**
     * @param string $path
     * @param $zip
     * @param string $sub_dir
     */
    function addFileToZip (string $path, $zip, string $sub_dir = ''): void {
        $handler = opendir($path); //打开当前文件夹由$path指定。
        while (($filename = readdir($handler)) !== false) {
            if ($filename != "." && $filename != "..") {
                //文件夹文件名字为'.'和‘..’，不要对他们进行操作
                if (is_dir($path . $filename)) {
                    // 如果读取的某个对象是文件夹，则递归
                    $localPath = $sub_dir . $filename . '/';
                    $this->addFileToZip($path . $filename . '/', $zip, $localPath);
                } else { //将文件加入zip对象
                    $zip->addFile($path . $filename, $sub_dir . $filename);
                }
            }
        }
        @closedir($handler);
    }

}